/**
 * FileContentManager is a Java based file manager desktop application, it can
 * show, edit and manipulate the content of the files archived inside a zip.
 * 
 * Copyright (C) 2007
 * 
 * Created by Camila Sanchez [http://mimix.wordpress.com/], Rafael Naufal
 * [http://rnaufal.livejournal.com] and Rodrigo [rdomartins@gmail.com]
 * 
 * FileContentManager is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by the
 * Free Software Foundation; either version 2.1 of the License, or (at your
 * option) any later version.
 * 
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with FileContentManager; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
package br.com.jteam.jfcm.controller.listener;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

import br.com.jteam.jfcm.controller.EventDispatchService;
import br.com.jteam.jfcm.controller.event.OpenFileEvent;
import br.com.jteam.jfcm.controller.event.UpdateFileHistoryEvent;
import br.com.jteam.jfcm.gui.PresentationFile;
import br.com.jteam.jfcm.gui.adapter.FileListContentAdapterException;
import br.com.jteam.jfcm.gui.adapter.FileListPresentationContentAdapter;
import br.com.jteam.jfcm.gui.bundle.BaseBundle;
import br.com.jteam.jfcm.gui.filechoser.ZipFileChooser;

/**
 * Classe que exibe um di&aacute;logo de escolha de arquivos e delega o arquivo
 * escolhido para o manipulador adequado.
 * 
 */
public class OpenFileListener implements ActionListener
{
	/**
	 * Adaptador para manipula&ccedil;&atilde;o de arquivos.
	 */
	private FileListPresentationContentAdapter adapter;

	/**
	 * Construtor que recebe um adaptador para manipula&ccedil;&atilde;o de
	 * arquivos.
	 * 
	 * @param adapter
	 *            Adaptador para manipula&ccedil;&atilde;o de arquivos.
	 * @throws IllegalArgumentException
	 *             Caso o adapter seja nulo.
	 */
	public OpenFileListener(FileListPresentationContentAdapter adapter)
	{
		if (adapter == null)
		{
			throw new IllegalArgumentException("Parameter cannot be null.");
		}
		this.adapter = adapter;
	}

	public void actionPerformed(ActionEvent e)
	{
		openFileDialog();
	}

	/**
	 * Abre o arquivo selecionado.
	 * 
	 * @param file
	 *            O arquivo a ser aberto.
	 */
	private void openFile(File file)
	{
		try
		{
			PresentationFile<?> presentationFile =
							adapter.openZipContent(file.getAbsolutePath());
			EventDispatchService eventService =
							EventDispatchService.getInstance();
			eventService.fireEvent(new OpenFileEvent(presentationFile));
			eventService.fireEvent(new UpdateFileHistoryEvent());
		} catch (FileListContentAdapterException e)
		{
			JOptionPane.showMessageDialog(	null,
											BaseBundle.getValue("error.openning.file"));
		}
	}

	/**
	 * Exibe um di&aacute;logo para a escolha de arquivos.
	 * 
	 */
	private void openFileDialog()
	{
		ZipFileChooser fileChooser = new ZipFileChooser();
		int returnVal = fileChooser.showOpenDialog(null);
		if (returnVal == JFileChooser.APPROVE_OPTION)
		{
			openFile(fileChooser.getSelectedFile());
		}
	}
}
